Volume 隸屬於Pod, 主要用在資料保存與數據分享, Pod內部的所有容器都可以共享Volume, 他放在Pod外部的某個儲存裝置上面, 可以獨立於Pod的生命週期之外, 實現數據持久化。
emptyDir
和 hostPath
屬於節點級別的Volume, 非持久型, emptyDir
生命週期和Pod相同, 使用hostPath
的Pod一旦被重新調度到其他節點就不能再使用這個Volume。nfs
, cephfs
, glusterfs
, gcePersistentDisk
, awsElasticBlockStore
。persistentVolumeClaim
: 用戶會透過 persistentVolumeClaim
對 PersistentVolume
申請使用內部存放的持久型數據。(後面補充)Secret
用於傳遞敏感資料, ConfigMap
用於注入非敏感資料到Pod裡面, 可以幫助實現Pod配置集中化管裡。spec可以掛載volume的字段有volumes
和 containers.volumeMounts
; volumes
是定義在Pod上面的Volume, 可以支援多種類型且配置參數差異很大, containers.volumeMounts
是在容器上定義掛載列表, 只能掛當前Pod有的實體Volume, 也可以不掛任何Volume, volumes
和 containers.volumeMounts
都是列表格式。實際上如果Pod裡面只有一個容器的時候, 掛Volume的目的就不在於共享, 而是在數據持久化。
spec 格式
spec:
...
containers:
- name: <String>
...
volumeMounts:
- name: <string>
mountPath: <string>
readOnly: <bool>
subPath: <string>
name
: 必填
, 要掛在的數據名稱mountPath
: 必填
, 掛載路徑,容器文件系統路徑readOnly
: 是否只能讀不能寫subPath
: 掛載子路徑, 在mountPath
底下要接的路徑Pod啟動時創建的一個臨時目錄, Pod移除時也會一併被移除, 只適用於在同一Pod裡面的容器間數據共享或做為容器間的緩存。
spec 字段包含兩個內容:
medium
: 儲存媒介類型, 預設default
, 或可用Memory
, Memory
表示基於RAM的臨時文件系統tmpfs, 通常用來作為緩存。sizeLimit
: 儲存空間限額, 預設nil
, 表示不限制, 但在medium設定為Memory
時建議要一併設定此參數hostpath 是指將Node上面某個文件系統的目錄或資料夾掛載到Pod上面的Volume, 它獨立在Pod生命週期之外, 具有持久性。
spec 字段包含兩個內容:
path
: 必填
, 指定Node上的目錄路徑type
: 指定volume類型獨立於cluster Node的持久性Volume。
NFS
NFS(Network File System) 是一種分布式文件系統協議, 支援client主機透過網路訪問服務器上的文件, 是由內核原生支援的網路文件系統, 屬於系統級的共享服務。
和emptyDir
不同的是, NFS
在Pod終止後只是被卸載而非刪除。
spec 字段包含:
server <string>
: 必填
, NFS服務器IP地址或主機名稱path <string>
: 必填
, NFS提供共享的文件系統路徑readOnly <boolean>
: 預設false
, 是否只能讀不能寫RDB
RDB類型的Volume有Ceph, Cepg是分布式的儲存系統平台, 具備幾個特性: 可擴展
, 高可靠
, 效能高
; 能同時支援區塊設備, 文件系統和REST三種儲存接口, 提供用於監控儲存叢集的介面, 還包含驗證與授權的功能, 可以兼容多種接口。
要配置RDB需要幾個條件:
spec 字段包含:
monitors <[]string>
: 必填
, Ceph 儲存監視器, 是以逗號分隔的字符串列表image <string>
: 必填
, rados image 名稱pool <string>
: rados 儲存持名稱, 預設RDB
user <string>
: rados 用戶名稱, 預設admin
keyring <string>
: RDB用戶認證時使用的keyring文件路徑, 預設/etc/ceph/keyring
secretRef <Object>
: 保存RDB用戶認證資訊的Serect 名稱, 會覆蓋keyring的私鑰readOnly <boolean>
: 是否只能讀不能寫fsType <boolean>
: 要掛載的文件類型, 需要是節點操作系統支持的文件系統, 例如: ext4, xfs, ntfs, 預設ext4
GlusterFS
GlusterFS (Gluster File System) 是一種開源的分布式文件系統, Gluster的核心, 支援橫向擴展。GlusterFS設計為一個可堆疊的用戶空間, 透過TCP/IP或 InfiniBand RDMA網路執行把物理分佈的儲存資源聚集在一起, 使用單一全域的命名空間來控管數據。
要配置GlusterFS需要幾個條件:
若要在GlusterFS使用動態供給機制可以部署heketi
, heketi
可以為 GlusterFS cluster提供RESTful風格的管理接口。
spec字段包含:
endpoints <string>
: 必填
, Endpoints 名稱, 用來提供GlusterFS cluster節點訊息作為其訪問接口path <string>
: 必填
, 用到的 GlusterFS cluster volume 路徑readOnly <boolean>
: 是否只能讀不能寫Cinder
Cinder 是OpenStack Block Storage的項目名稱, 用來提供虛擬機(VM)持久區塊儲存功能。Cinder支持多種後端儲存方式, 包含LVM, NFS, Ceph等, 其具備Restful API功能, 並能調度Volume創建的請求, 進而優化儲存資源的分配。
將K8s部署於 OpenStack 構建的IaaS環境中時, Cinder的區塊儲存功能可以為Pod提供外部持久化儲存方式。
spec字段包含:
volumeID <string>
: 必填
, 用來識別別Cinder內各個Volume的識別符readOnly <boolean>
: 是否只能讀不能寫fsType <boolean>
: 要掛載的文件類型, 需要是節點操作系統支持的文件系統, 例如: ext4, xfs, ntfs, 預設ext4
沒想到Volume有這麼多種類及組合方式, 由Volume延伸出去可以研讀的項目很多, 之後再補延伸知識了。
最近這幾篇都無法一天讀完一個項目, 每個項目裡面包含的東西不少, 我一邊看一邊過濾目前需不需要去深究看到的名詞或是議題, 盡量把範圍抓好, 不要讓自己掉得太深。
鐵人賽來到學習K8s的第17天, 開始想要一邊喝酒一邊寫是正常的嗎?